home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / docs / mags / agsaku29.lha / Ohjelmat / Ball.c next >
Encoding:
C/C++ Source or Header  |  1999-06-22  |  7.2 KB  |  311 lines

  1.  
  2. /*
  3.  Yritetty tehdä ohjelmaa jolla piirtyisi Boing Pallo 3-d:ä komeasti
  4.  varjostettuna. Vaatii AGA:n
  5.  
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <math.h>
  11. #include <intuition/intuition.h>
  12. #include <intuition/screens.h>
  13. #include <clib/exec_protos.h>
  14. #include <clib/graphics_protos.h>
  15. #include <clib/intuition_protos.h>
  16. #include <graphics/rastport.h>
  17.  
  18. typedef struct Screen Screen;
  19. typedef struct Window Window;
  20. typedef struct IntuiMessage IntuiMessage;
  21.  
  22. Screen *Scr;
  23. Window *Win;
  24. struct TmpRas TmpRas;
  25.  
  26. struct NewScreen Ns = {
  27.     0, 0, 640, -1, 8,
  28.     -1, -1,
  29.     LACE|HIRES,
  30.     CUSTOMSCREEN,
  31.     NULL,
  32.     "Boing pallo"
  33. };
  34.  
  35. struct NewWindow Nw = {
  36.     0, 0, 0, 0,
  37.     -1, -1,
  38.  
  39.     IDCMP_MOUSEBUTTONS|IDCMP_MOUSEMOVE|IDCMP_CLOSEWINDOW|IDCMP_NEWSIZE,
  40.  
  41.     WFLG_CLOSEGADGET|WFLG_DRAGBAR|WFLG_SIZEGADGET|
  42.     WFLG_SIMPLE_REFRESH|WFLG_REPORTMOUSE|
  43.     WFLG_ACTIVATE|WFLG_RMBTRAP|WFLG_NOCAREREFRESH,
  44.  
  45.     NULL, NULL, "Boing pallo",
  46.     NULL,
  47.     NULL,
  48.     16, 32, -1, -1,
  49.     CUSTOMSCREEN
  50. };
  51. struct piste{      /* tietuerakenne pisteille */
  52.   int x;                /* alkuperäiset x,y.z */
  53.   int y;
  54.   int z;
  55.   float xt;               /* kierretyt */
  56.   float zt;
  57.   float yt;
  58.   int xscr,yscr;        /* screenin x ja y */
  59. };
  60. struct piste *pisteet;
  61. int xmax=640,
  62.     ymax=256,
  63.     origx,
  64.     origy,
  65.     origz,
  66.     x0,
  67.     y0,
  68.     kpl=64,
  69.     kpl1;
  70.  
  71. float sini[3601],         /* taulukoidut sinit ja kosinit */
  72.       cosi[3601];
  73. int az,ax,ay;             /* kiertokulmat */
  74. int ca;                   /* punaisten ja valkoisten värisävyjen määrä */
  75. float r;
  76. WORD koord[10]; /* Areamove, AreaDraw ja AreaEnd -funktioille */
  77.  
  78. UBYTE AreaBuffer[(5+1)*5];
  79. struct AreaInfo AreaInfo;
  80.  
  81.  
  82.  
  83. /* Pyörittää pistettä p->(x,y,z) kulmien ax,ay ja az verran
  84.    Tulos kenttiin p->(xt,yt,zt)                                 */
  85.  
  86. void Pyorita(struct piste *p)
  87. {
  88.     float txapu,tyapu,tzapu;
  89.     txapu=(p->y*sini[az])+(p->x*cosi[az]);
  90.     tyapu=(p->y*cosi[az])-(p->x*sini[az]);
  91.  
  92.     p->yt=(p->z*sini[ax])+(tyapu*cosi[ax]);
  93.     tzapu=(p->z*cosi[ax])-(tyapu*sini[ax]);
  94.  
  95.     p->xt=(tzapu*sini[ay])+(txapu*cosi[ay]);
  96.     p->zt=(tzapu*cosi[ay])-(txapu*sini[ay]);
  97.  
  98. }
  99.  
  100. /* Laskee pisteen p->(xt,yt,zt) projektion 2d tasossa screenillä */
  101. void Projisoi(struct piste *p)
  102. {
  103.     float temp;
  104.     if (p->zt==0) p->zt=1;
  105.     temp=xmax/(xmax-(p->zt+origz));
  106.     p->xscr=x0+(p->xt+origx)*temp;
  107.     p->yscr=y0-((p->yt+origy)*temp);
  108.  
  109. }
  110. void Piirra()
  111. {
  112.     int i,c,rkpl=4,kier=0,askel=0,pun;
  113.     for (i=kpl+2; i<kpl1; i++)
  114.      {
  115.         if (pisteet[i].zt>0)
  116.         {
  117.  
  118.          kier=i/(kpl+1);
  119.          askel=i-(kier*(kpl+1));
  120.  
  121.          SHORT apu1=-(((askel-(askel>((kpl+1)/2)))/rkpl)%2);
  122.          SHORT apu2=((((kier-1)/rkpl) %2)==1);
  123.  
  124.          pun = (apu1||apu2) && !(apu1 && apu2);
  125.          pun=!(pun);
  126.  
  127.          if (pun) c=129; else c=255;
  128.  
  129.          /*printf("i=%d kier=%d askel=%d pun=%d color=%d\n",i,kier,askel,pun,c);*/
  130.  
  131.  
  132.          float rr=-r;
  133.          float etx=rr-pisteet[i].xt;
  134.          float ety=-pisteet[i].yt;
  135.          float etz=-pisteet[i].zt;
  136.  
  137.          float et2=((etx*etx)+(ety*ety)+(etz*etz));
  138.  
  139.          float alfa=facos((-et2+2*r*r)/(2*r*r));
  140.          int tum=(ca-1)*(alfa/M_PI);
  141.  
  142.          /*printf("%d %lf %lf %lf %lf\n",tum,alfa/M_PI,etx,et2,alfa);*/
  143.  
  144.          SetAPen(Win->RPort,c-tum);
  145.          koord[0]=pisteet[i].xscr; koord[1]=pisteet[i].yscr;
  146.          koord[2]=pisteet[i-1].xscr; koord[3]=pisteet[i-1].yscr;
  147.          koord[4]=pisteet[i-kpl-2].xscr; koord[5]=pisteet[i-kpl-2].yscr;
  148.          koord[6]=pisteet[i-kpl-1].xscr; koord[7]=pisteet[i-kpl-1].yscr;
  149.          koord[8]=pisteet[i].xscr; koord[9]=pisteet[i].yscr;
  150.  
  151.  
  152.          AreaMove(Win->RPort,koord[0],koord[1]);
  153.          AreaDraw(Win->RPort,koord[2],koord[3]);
  154.          AreaDraw(Win->RPort,koord[4],koord[5]);
  155.          AreaDraw(Win->RPort,koord[6],koord[7]);
  156.          AreaDraw(Win->RPort,koord[8],koord[9]);
  157.          AreaEnd(Win->RPort);
  158.          }
  159.      }
  160. }
  161.  
  162.  
  163. void myexit(void);
  164.  
  165. main(ac, av)
  166. int ac;
  167. char *av[];
  168. {
  169.     short notDone = 1;
  170.     short down = 0;
  171.     char pen = 1;
  172.  
  173.     atexit(myexit);
  174.     int i;
  175.   
  176.    
  177.     int a,b;
  178.     float aske=3600/kpl;
  179.     r=ymax/1.5;
  180.     origx=0;
  181.     origy=0.8*-r;
  182.     origz=0;
  183.     x0=xmax/2;
  184.     y0=ymax/2;
  185.     for (i=0; i<=3600; i++)
  186.     {
  187.         sini[i]=sin(2*M_PI*i/3600);
  188.         cosi[i]=cos(2*M_PI*i/3600);
  189.     }
  190.     i=0;
  191.     pisteet=(struct piste*) calloc(1,sizeof(struct piste));
  192.     for (a=0; a<=1800; a=a+aske)
  193.     {
  194.         for (b=0; b<=3600; b=b+aske)
  195.         {
  196.                 pisteet=(struct piste*) realloc(pisteet,(i+1)*sizeof(struct piste));
  197.                 pisteet[i].x=r*cosi[b]*sini[a];
  198.                 pisteet[i].y=r*sini[b];
  199.                 pisteet[i].z=r*cosi[b]*cosi[a];
  200.                 i++;
  201.         }
  202.     }
  203.     az=450; ax=450; ay=450;
  204.  
  205.  
  206.     kpl1=i;
  207.     if (Scr = OpenScreen(&Ns)) {
  208.         Nw.TopEdge= 6;
  209.         Nw.Height = Scr->Height - Nw.TopEdge;
  210.         Nw.Width  = Scr->Width;
  211.  
  212.         Nw.Screen = Scr;
  213.  
  214.         
  215.         if (Win = OpenWindow(&Nw)) {
  216.  
  217.  
  218. /****** Asetetaan värit 4-129 mustasta punaiseen ja 130 -255 mustasta valkoiseen *******/
  219.  
  220.             int c0=4;
  221.             ca=(256-c0)/2;
  222.             int i2=c0+ca-1,i1=c0;
  223.             
  224.             float k=255/ca;
  225.             ULONG R;
  226.             int ra;
  227.  
  228.             for (i=c0; i<=i2; i++) {   /* mustasta punaiseen */
  229.                 ra=(i-c0)*k;
  230.                 R=ra<<24;
  231.                 SetRGB32(&Scr->ViewPort,i,R,0,0);
  232.             }
  233.             i1=ca+c0;
  234.             for (i=i1; i<=255; i++) {  /* mustasta valkoiseen */
  235.                 ra=(i-i1)*k;
  236.                 R=ra<<24;
  237.                 SetRGB32( &Scr->ViewPort,i,R,R,R);
  238.             }   
  239.  
  240. /*********/
  241.             InitArea(&AreaInfo,AreaBuffer,(4+1)*5);
  242.  
  243.             PLANEPTR Pointer;
  244.  
  245.             Pointer=AllocRaster(640,256);
  246.  
  247.             Win->RPort->AreaInfo=&AreaInfo;
  248.  
  249.             InitTmpRas(&TmpRas,Pointer,RASSIZE(640,256));
  250.             Win->RPort->TmpRas=&TmpRas;
  251.  
  252. /**** Pyöritetään pisteitä ax,ay ja az astetta ja projisoidaan **************/
  253.  
  254.             for (i=0; i<kpl1; i++)
  255.             {
  256.                 Pyorita(&pisteet[i]);
  257.                 Projisoi(&pisteet[i]);
  258.             }
  259.  
  260.             Piirra();
  261.  
  262.             while (notDone) {   /* "Pääluuppi" jossa ei tehdä vielä mitään */
  263.                 IntuiMessage *imsg;
  264.  
  265.                 WaitPort(Win->UserPort);
  266.                 while (imsg = (IntuiMessage *)GetMsg(Win->UserPort)) {
  267.                     switch(imsg->Class) {
  268.                     case IDCMP_CLOSEWINDOW:
  269.                         notDone = 0;
  270.                         break;
  271.                     case IDCMP_MOUSEBUTTONS:
  272.                         switch(imsg->Code) {
  273.                         case SELECTDOWN:
  274.                             down = 1;
  275.                             break;
  276.                         case SELECTUP:
  277.                             down = 0;
  278.                             break;
  279.                         }
  280.                         break;
  281.                     case IDCMP_MOUSEMOVE:
  282.                         if (down);
  283.                         break;
  284.  
  285.                     case IDCMP_NEWSIZE:
  286.                         Piirra();
  287.                         break;
  288.                     }
  289.                     ReplyMsg(&imsg->ExecMessage);
  290.                 }
  291.             }
  292.         }
  293.     }
  294.     return(0);
  295. }
  296.  
  297. void
  298. myexit(void)
  299. {
  300.     if (Win) {
  301.         CloseWindow(Win);
  302.         Win = NULL;
  303.     }
  304.     if (Scr) {
  305.         CloseScreen(Scr);
  306.         Scr = NULL;
  307.     }
  308.     free(pisteet);
  309. }
  310.  
  311.